import numpy as np
import matplotlib.pyplot as plt

# 中文显示（可选）
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 目标函数及其导数（这里以 f(x)=x² 为例，可自行替换）
def f(x):
    return x**2

def f_prime(x):
    return 2 * x

# 绘图范围
x = np.linspace(-1.5, 2.5, 400)
y = f(x)

# 当前迭代点
x_n = 1.0                     # 任选一个起始点
x_next = x_n - f(x_n) / f_prime(x_n)   # 牛顿法更新公式

# 切线数据
x_tangent = np.linspace(x_n - 0.5, x_n + 1.0, 100)
y_tangent = f_prime(x_n) * (x_tangent - x_n) + f(x_n)

# 创建图形
fig, ax = plt.subplots(figsize=(8, 6))

# 绘制函数曲线
ax.plot(x, y, 'k-', linewidth=2, label=r'$y = f(x)$')

# 绘制切线
ax.plot(x_tangent, y_tangent, 'k--', linewidth=2,
        label=r"$y = f'(x_n)(x - x_n) + f(x_n)$")

# 坐标轴
ax.axhline(0, color='k', linewidth=1)
ax.axvline(0, color='k', linewidth=1)

# 标记迭代点
ax.plot([x_n, x_n], [0, f(x_n)], 'r--', linewidth=1.5)   # 垂直虚线
ax.plot(x_n, 0, 'ro', markersize=5)                    # x_n 点
ax.plot(x_next, 0, 'ro', markersize=5)                 # x_{n+1} 点

# 文本标注
ax.text(x_n, -0.1, r'$x_n$', color='red', fontsize=12,
        ha='center')
ax.text(x_next, -0.1, r'$x_{n+1}$', color='red', fontsize=12,
        ha='center')
#ax.text(1.5, 0.5, r"$y = f'(x_n)(x - x_n) + f(x_n)$", color='black', fontsize=12)
#ax.text(1.5, 1.5, r"$y = f(x)$", color='black', fontsize=12)

# 坐标轴标签
ax.set_xlabel(r'$x$', fontsize=14)
ax.set_ylabel(r'$y$', fontsize=14)

# 视图范围
ax.set_xlim(-1.5, 2.5)
ax.set_ylim(-0.5, 3.0)

# 关闭网格（可选）
ax.grid(False)

# 图例（可选）
ax.legend(loc='upper left', fontsize=12)

plt.tight_layout()
plt.show()
